﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization.Policy;
 

namespace MyWebapiDemo.Handler
{
    /// <summary>
    ///授权验证过滤器。
    ///FunId和FunIds为空，不验证权限
    /// </summary>
    /// 修改时间：2025-9-29 00:10:36
    public class LoginFilter : Attribute, IAsyncAuthorizationFilter
    {
        private List<long> FunIds { get; set; }

        public LoginFilter()
        {
        }

        /// <summary>
        /// 构造函数，传递无个数限制的权限值
        /// </summary>
        /// <param name="funIds">权限值</param>
        /// 新增时间：2024年6月17日10:13:58， 
        public LoginFilter(params long[] funIds)
        {
            FunIds = funIds?.ToList() ?? new List<long>();
        }


        /// <summary>
        /// 异步授权过滤器方法，用于验证登录状态和权限
        /// </summary>
        /// <param name="context">授权过滤器上下文</param>
        /// <returns>表示异步操作的 Task</returns>
        /// 修改时间：2024年6月17日10:05:02，
        public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            // 检查请求是否为 AJAX 请求
            bool isAjax = RootHandler.IsAjax(context.HttpContext.Request);
            string? loginJson = null;
                //context.HttpContext.Session.GetString(KeySetConfig.LoginSessionKey);

            // 如果登录信息为空或未提供，则进行未授权处理
            if (string.IsNullOrWhiteSpace(loginJson))
            {
                //if (isAjax)
                //{
                //    context.Result = new JsonResult(new { Code = 500, Msg = "登录失效，请重新登录" })
                //    {
                //        StatusCode = StatusCodes.Status401Unauthorized
                //    };
                //}
                //else
                //{
                //    //跳转登录
                //    // context.Result = new RedirectResult("/user/Login");
                //}
                context.Result = new JsonResult(new { Code = 500, Msg = "登录失效，请重新登录" })
                {
                    StatusCode = StatusCodes.Status401Unauthorized
                };

                await Task.CompletedTask;
                return;
            }

            //// 如果无法解析用户信息，则处理为未授权
            //if (userView == null)
            //{
            //    HandleUnauthorized(context);
            //    return;
            //}

            //根据用户当前权限列表，检查是否具有所需权限
            //可以在登录成功后，返回token之前，将用户有的权限存入缓存中，然后在此处取出判断
            bool hasPermission = false;//FunIds.Any(id => userFunctions.Contains(id.ToString()));

            // 如果没有权限，则进行未授权处理
            if (!hasPermission)
            {
                HandleUnauthorized(context);
            }
            await Task.CompletedTask;
        }
         
        /// <summary>
        /// 处理无权访问情况，设置 403 禁止访问状态
        /// </summary>
        /// <param name="context"></param>
        /// 新增时间：2024年6月17日09:59:55，
        private void HandleUnauthorized(AuthorizationFilterContext context)
        {
            context.Result = new ContentResult
            {
                Content = "你无权访问",
                StatusCode = StatusCodes.Status403Forbidden
            };
        }



    }

}